import { ref, onMounted, onUnmounted } from 'vue';
import { useAudioCoordinatorStore } from "@/stores/useAudioCoordinatorStore";

/**
 * 音频播放逻辑 Composable
 * @param {string} initialUrl - 音频文件地址
 */
export function useAudio(initialUrl) {
    // 使用 Pinia Store
    const coordinator = useAudioCoordinatorStore();
    // 为每个实例生成唯一ID
    const instanceId = Symbol(initialUrl);
    // 音频地址
    const audioUrl = ref(initialUrl);
    // 状态
    const duration = ref(0);
    const currentTime = ref(0);
    const isPlaying = ref(false);
    let audio = null;

    // --- 方法 ---
    const setUrl = (newUrl) => {
        audioUrl.value = newUrl;
        // 重新初始化音频实例，并加载元数据
        if (audio) {
            pause();
            // 重新触发元数据加载
            audio.src = newUrl;
            // 强制浏览器重新加载新资源
            audio.load();
            // 注意：这里 setUrl 只需要负责设置 URL 并加载，播放交给 play/togglePlay 处理
        } else {
            loadMetadata(); // 如果是第一次，调用 loadMetadata
        }
    }

    const loadMetadata = () => {
        if (!audio) {
            audio = new Audio(audioUrl.value);

            // 监听元数据加载完成事件
            audio.addEventListener('loadedmetadata', () => {
                duration.value = audio.duration;
            });

            // 监听播放时间更新事件，更新当前播放时间
            audio.addEventListener('timeupdate', () => {
                currentTime.value = audio.currentTime;
            });

            // 监听播放完成事件
            audio.addEventListener('ended', () => {
                // 播放结束，暂停音频
                isPlaying.value = false;
                // 播放结束，通知 Pinia 清理全局状态
                coordinator.stopPlayback(instanceId);
            });
        }
    }

    const pause = () => {
        if (audio && !audio.paused) {
            audio.pause();
            // 暂停成功，更新状态
            isPlaying.value = false;
            // 暂停，通知 Pinia 清理全局状态
            coordinator.stopPlayback(instanceId);
        }
    }

    const play = () => {
        // 1. 通知 Pinia，启动独占播放模式 (确保其他音频暂停)
        coordinator.startPlayback(instanceId);

        // 2. 只有在 Pinia 更新全局状态后，我们才播放
        // (注: Pinia的更新是同步的，所以直接播放即可)
        audio.play();

        // 播放成功 (通常在音频已加载或浏览器允许直接播放时发生)
        isPlaying.value = true;
    }

    const togglePlay = () => {
        if (!audio) {
            // 尝试重新加载元数据
            loadMetadata();
            return;
        }

        // 切换播放状态
        if (isPlaying.value) {
            pause();
        } else {
            play();
        }
    }

    // --- 生命周期和注册 ---
    onMounted(() => {
        loadMetadata();
        // 注册实例和它的控制方法到 Pinia Store
        coordinator.registerInstance(instanceId, pause, isPlaying);
    });

    onUnmounted(() => {
        // 清理资源，并从 Pinia Store 中注销
        pause();
        coordinator.unregisterInstance(instanceId);
        audio = null;
    });

    return {
        duration,
        currentTime,
        isPlaying,
        togglePlay,
        setUrl,
    };
}